package bar.dark.lee.alarm.common;

import java.math.BigInteger;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Calendar;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Color;
import android.util.DisplayMetrics;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;

public class BDUtil
{
	private static boolean returnBool = false;
	
	/**
	 * 돈을 xx,xxx,xxx 형태로 리턴
	 * @param money
	 * @return
	 */
	public static String getWon(String money) {
		String temp = "";
		try {
			NumberFormat nf = NumberFormat.getNumberInstance();
//			temp =  nf.format(Integer.parseInt(money));
			temp =  nf.format(new BigInteger(money));
		} catch (Exception e) {
			return money;
		}
		return temp;
	}
	
	/**
	 * 요일을 반환 하는 메소드
	 * @param year 년도
	 * @param month 월
	 * @param day 일
	 * @return 요일
	 */
	public static String getWeekDay(int year, int month, int day)
    {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month, day);
		int week = cal.get(Calendar.DAY_OF_WEEK);
    	
    	return getWeekDay(week);
    }
	
	/**
	 * 요일을 반환 하는 메소드
	 * @param week 요일정수
	 * @return 요일
	 */
	public static String getWeekDay(int week)
    {
    	String weekDay = "";
    	
    	switch (week)
		{
			case 1:
				weekDay = "일요일";
				break;
			case 2:
				weekDay = "월요일";
				break;
			case 3:
				weekDay = "화요일";
				break;
			case 4:
				weekDay = "수요일";
				break;
			case 5:
				weekDay = "목요일";
				break;
			case 6:
				weekDay = "금요일";
				break;
			case 7:
				weekDay = "토요일";
				break;
		}
    	
    	return weekDay;
    }
	
	/**
	 * 한자 요일과 색을 반환 하는 메소드
	 * @param year 년도
	 * @param month 월
	 * @param day 일
	 * @return WeekDayClass
	 */
	public static WeekDayClass getWeekDayChinese(int year, int month, int day)
    {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month, day);
		int week = cal.get(Calendar.DAY_OF_WEEK);
    	
		WeekDayClass weekDay = new WeekDayClass();
		
		switch (week)
		{
			case 1:
				weekDay.setWeekDayStr("(日)");
				weekDay.setWeekDayColor(Color.RED);
				break;
			case 2:
				weekDay.setWeekDayStr("(月)");
				weekDay.setWeekDayColor(Color.BLACK);
				break;
			case 3:
				weekDay.setWeekDayStr("(火)");
				weekDay.setWeekDayColor(Color.BLACK);
				break;
			case 4:
				weekDay.setWeekDayStr("(水)");
				weekDay.setWeekDayColor(Color.BLACK);
				break;
			case 5:
				weekDay.setWeekDayStr("(木)");
				weekDay.setWeekDayColor(Color.BLACK);
				break;
			case 6:
				weekDay.setWeekDayStr("(金)");
				weekDay.setWeekDayColor(Color.BLACK);
				break;
			case 7:
				weekDay.setWeekDayStr("(土)");
				weekDay.setWeekDayColor(Color.BLUE);
				break;
		}
    	
    	return weekDay;
    }
	
	public static class WeekDayClass 
	{
		private String weekDayStr;
		private int weekDayColor;
		public String getWeekDayStr() {
			return weekDayStr;
		}
		public void setWeekDayStr(String weekDayStr) {
			this.weekDayStr = weekDayStr;
		}
		public int getWeekDayColor() {
			return weekDayColor;
		}
		public void setWeekDayColor(int weekDayColor) {
			this.weekDayColor = weekDayColor;
		}
	}
	
	/**
	 * 숫자를 두자리로 변환한다.
	 * @param number
	 * @return
	 */
	public static String getTwoNumber(int number)
	{
		String result = "";
		
		if (number < 10)
		{
			result = "0" + number;
		}
		else
		{
			result = "" + number;
		}
		
		return result;
	}
	
	/**
	 * 날짜 데이터 포맷을 반환하는 메소드 (형태 : YYYY - MM - DD)
	 * @param year 년도
	 * @param month 월
	 * @param day 일
	 * @return 전체 날짜
	 */
	public static String getDate(int year, int month, int day)
	{
		String m = "" + (month);
		String d = "" + day;
		
		if (month < 10)
		{
			m = "0" + (month);
		}
		
		if (day < 10)
		{
			d = "0" + day;
		}
		
		return year + " - " + m + " - " + d;
	}
	
	/**
	 * 날짜를 DB에 들어가는 YYYYMMDD 형태로 반환한다.
	 * @param year
	 * @param month
	 * @param day
	 * @return
	 */
	public static String getDateDB(int year, int month, int day)
	{
		String m = "" + (month);
		String d = "" + day;
		
		if (month < 10)
		{
			m = "0" + (month);
		}
		
		if (day < 10)
		{
			d = "0" + day;
		}
		
		return year + m + d;
	}
	
	/**
	 * 디비에서 긁어온 날짜 데이터를 버튼에 넣기 위해 가공하는 클래스
	 * @param date
	 * @return (형태 : YYYY - MM - DD)
	 */
	public static String getDateButton(String date)
	{
		String year;
		String month;
		String day;
		
		try
		{
			year = date.substring(0, 4);
			month = date.substring(4, 6);
			day = date.substring(6, date.length());
		} catch (Exception e)
		{
			return date;
		}
		
		return year + " - " + month + " - " + day;
	}
	
	/**
	 * 디비에서 긁어온 날짜 데이터를 년 월 일로 분리해서 배열로 리턴한다.
	 * @param date
	 * @return
	 */
	public static int [] getDataSet(String date)
	{
		int [] dateSet = new int[3];
		dateSet[0] = Integer.parseInt(date.substring(0, 4));
		dateSet[1] = Integer.parseInt(date.substring(4, 6));
		dateSet[2] = Integer.parseInt(date.substring(6, date.length()));
		
		return dateSet;
	}
	
	/**
	 * 토스트 출력
	 * @param msg 메세지
	 * @param length length
	 */
	public static void showToast(Context context, String msg)
	{
		Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
	}
	
	/**
	 * 기본 알림 다이얼로그를 보여준다.
	 * @param context
	 * @param title
	 * @param msg
	 */
	public static void showDialog(final Context context, String title, String msg)
	{
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(title);
		builder.setMessage(msg);
		builder.setIcon(android.R.drawable.ic_dialog_info);
		builder.setNegativeButton("확인", new OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				BDUtil.btnEnable = true;
				BDUtil.asyncFlag = 0;
				
				dialog.dismiss();
			}
		});
		builder.setOnCancelListener(new OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				BDUtil.btnEnable = true;
				BDUtil.asyncFlag = 0;
				
				dialog.dismiss();
			}
		});
		AlertDialog dialog = builder.create();
		dialog.show();
	}
	
	/**
	 * 기본 알림 피니쉬 다이얼로그를 보여준다.
	 * @param context
	 * @param title
	 * @param msg
	 */
	public static Boolean btnEnable = true;
	public static int asyncFlag = 0;
	public static void showDialogFinish(final Context context, String title, String msg)
	{
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(title);
		builder.setMessage(msg);
		builder.setIcon(android.R.drawable.ic_dialog_info);
		builder.setNegativeButton("확인", new OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				BDUtil.btnEnable = true;
				BDUtil.asyncFlag = 0;
				
				dialog.dismiss();
				((Activity)context).finish();
			}
		});
		builder.setOnCancelListener(new OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				BDUtil.btnEnable = true;
				BDUtil.asyncFlag = 0;
				
				dialog.dismiss();
			}
		});
		AlertDialog dialog = builder.create();
		dialog.show();
	}
	
	/**
	 * 예  다이얼로그 보여준다
	 * @param context
	 * @param title
	 * @param msg
	 * @param okListener
	 */
	public static void showDialogOK(Context context, String title, 
			String msg, DialogInterface.OnClickListener okListener)
	{
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(title);
		builder.setMessage(msg);
		builder.setIcon(android.R.drawable.ic_dialog_info);
		builder.setPositiveButton("확인", okListener);
		builder.setCancelable(false);
		AlertDialog dialog = builder.create();
		dialog.show();
	}
	
	/**
	 * 예, 아니오 다이얼로그 보여준다
	 * @param context
	 * @param title
	 * @param msg
	 * @param okListener
	 */
	public static void showSelectDialog(Context context, String title, 
			String msg, DialogInterface.OnClickListener okListener)
	{
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(title);
		builder.setMessage(msg);
		builder.setIcon(android.R.drawable.ic_dialog_info);
		builder.setPositiveButton("예", okListener);
		builder.setNegativeButton("아니오", new OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
			}
		});
		AlertDialog dialog = builder.create();
		dialog.show();
	}
	
	/**
	 * 예, 아니오 다이얼로그 보여준다
	 * @param context
	 * @param title
	 * @param msg
	 * @param okListener
	 * @param noListener
	 */
	public static void showSelectDialog(Context context, String title, 
			String msg, DialogInterface.OnClickListener okListener, DialogInterface.OnClickListener noListener)
	{
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(title);
		builder.setMessage(msg);
		builder.setIcon(android.R.drawable.ic_dialog_info);
		builder.setPositiveButton("예", okListener);
		builder.setNegativeButton("아니오", noListener);
		AlertDialog dialog = builder.create();
		dialog.show();
	}
	
	/**
	 * 검색 리스트 데이터 두개를 비교해서 중복 값을 체크한다.
	 * @param orgList 
	 * @param selectList
	 * @return
	 */
	public static boolean getListOverlapCheck(ArrayList<String> orgList, ArrayList<String> selectList)
	{
		for (int i = 0; i < selectList.size(); i++)
		{
			String selectData = selectList.get(i);
			
			for (int j = 0; j < orgList.size(); j++)
			{
				String orgData = orgList.get(j);
				
				if (selectData.equals(orgData))
				{
					return true;
				}
			}
		}
		
		return false;
	}
	
	/**
	 * dip 를 pixel로 변환한다. 모든 스크린에서 사용자에게 동일한 크기로 보여지게 하기 위해서 사용한다.
	 * @param context
	 * @param pixel
	 * @return
	 */
	public static int dipToPixel(Context context, float dip)
	{
		DisplayMetrics metrics = new DisplayMetrics();
		((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metrics);
		int densityDpi = metrics.densityDpi;
		return (int)(dip * ((float)densityDpi/(float)160));
	}
	
	
	/**
	 * 키보드를 강제로 내린다.	
	 */
	public static void hideKeyBoard(Context context, EditText editText)
	{
		InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
		if(editText != null)
			imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
	}
}
